package com.blacktech.dbu.meta.repository;

import com.blacktech.dbu.meta.entity.DbuProduct;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 产品信息Repository
 * 移除Spring Data REST注解，改为自定义Controller
 *
 * @author yanyunsong
 */
@Repository
public interface ProductRepository extends JpaRepository<DbuProduct, Long>, JpaSpecificationExecutor<DbuProduct> {

    /**
     * 根据产品代号查找产品
     */
    Optional<DbuProduct> findByProductCode(String productCode);

    /**
     * 检查产品代号是否存在
     */
    boolean existsByProductCode(String productCode);

    /**
     * 根据产品代号查找产品（忽略大小写）
     */
    @Query("SELECT p FROM DbuProduct p WHERE LOWER(p.productCode) = LOWER(:productCode)")
    Optional<DbuProduct> findByProductCodeIgnoreCase(String productCode);

    /**
     * 检查产品代号是否存在（忽略大小写）
     */
    @Query("SELECT COUNT(p) > 0 FROM DbuProduct p WHERE LOWER(p.productCode) = LOWER(:productCode)")
    boolean existsByProductCodeIgnoreCase(String productCode);

    /**
     * 统计产品总数
     */
    default long countByActiveTrue() {
        return count();
    }

    /**
     * 根据产品代号列表查找产品
     */
    @Query("SELECT p FROM DbuProduct p WHERE p.productCode IN :productCodes")
    List<DbuProduct> findByProductCodeIn(@Param("productCodes") List<String> productCodes);

    /**
     * 模糊搜索产品
     */
    @Query("SELECT p FROM DbuProduct p WHERE " +
           "LOWER(p.productCode) LIKE LOWER(CONCAT('%', :keyword, '%')) OR " +
           "LOWER(p.productName) LIKE LOWER(CONCAT('%', :keyword, '%')) OR " +
           "LOWER(p.productDesc) LIKE LOWER(CONCAT('%', :keyword, '%'))")
    List<DbuProduct> searchByKeyword(@Param("keyword") String keyword);
}
